#define _CRT_SECURE_NO_WARNINGS 1

#include "seqlist.h"
void SLInit(SL* sl)
{
	sl->_arr = NULL;
	sl->_capacity = sl->_size = 0;
}
void SLDestory(SL* sl)
{
	assert(sl);
	free(sl->_arr);
	sl->_arr = NULL;
	sl->_capacity = sl->_size = 0;
}
void Print(SL* sl)
{
	assert(sl);
	for (int i = 0; i < sl->_size; i++)
	{
		printf("%d ", sl->_arr[i]);
	}
	printf("\n");
}

void SLCheckCapacity(SL* sl)
{
	if (sl->_capacity == sl->_size)
	{
		size_t newCapacity = sl->_capacity == 0 ? 4 : sl->_capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(sl->_arr, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
			return;
		}
		sl->_arr = tmp;
		sl->_capacity = newCapacity;
	}
}
void SLPushBack(SL* sl, SLDataType x)
{
	assert(sl);

	SLCheckCapacity(sl);

	sl->_arr[sl->_size++] = x;
}
void SLPushFront(SL* sl, SLDataType x)
{
	assert(sl);

	SLCheckCapacity(sl);

	size_t end = sl->_size;

	while (end > 0)
	{
		sl->_arr[end] = sl->_arr[end - 1];
		--end;
	}

	sl->_arr[0] = x;
	++sl->_size;
}

void SLPopBack(SL* sl)
{
	assert(sl);
	assert(sl->_size > 0);

	--sl->_size;
}
void SLPopFront(SL* sl)
{
	assert(sl);
	assert(sl->_size > 0);

	size_t start = 0;
	while (start < sl->_size - 1)
	{
		sl->_arr[start] = sl->_arr[start + 1];
		++start;
	}

	--sl->_size;
}

void SLInsert(SL* sl, size_t pos, SLDataType x)
{
	assert(sl);
	assert(sl->_size > 0);

	size_t end = sl->_size;
	while (end > pos)
	{
		sl->_arr[end] = sl->_arr[end - 1];
		--end;
	}
	sl->_arr[pos] = x;
	++sl->_size;
}

void SLErase(SL* sl, size_t pos)
{
	assert(sl);
	assert(sl->_size > 0);

	size_t start = pos;
	while (start < sl->_size - 1 )
	{
		sl->_arr[start] = sl->_arr[start + 1];
		++start;
	}
	--sl->_size;
}

size_t SLFind(SL* sl, SLDataType x)
{
	assert(sl);
	assert(sl->_size > 0);

	for (int i = 0; i < sl->_size; i++)
	{
		if (sl->_arr[i] == x)
		{
			return i;
		}
	}

	return -1;
}
